Introduction
NOTE: this text is placeholder and must be changed
Census tracts were assigned a “vulnerability score” between 0 and 4, with a weight of 1 for each of the following that is true:
- Greater than XX% of households are renters
- Greater than XX% of the population are communities of color
- Greater than XX% of the population 25 years and older do not have a bachelor’s degree
- Greater than XX% of households have incomes at or below at or below 80% of the HUDadjusted median family income (MFI) [Note: HUD’s FY2015 MFI for the Seattle-Bellevue, WA HUD Metro FMR Area was $89,500.]
We defined vulnerable tracts as those with a vulnerability score of at least 3 out of 4.
Population in Renter-Occupied Housing Units (%), 2010-2014

COO Communities
Some values were outside the color scale and will be treated as NA
Adults 25+ With Less Than a Bachelor Degree (%), 2010-2014

Household earning less than 80% of the HUD , 2010-2014
This indicator is intended as a proxy for low-income households. There are many possible ways to determine whether a household fits this category, but one commonly-used metric is the area median income (AMI). Generally speaking, households earning less than 80% AMI are considered to be low-income households, as status which has implications for affordable housing eligibility.
The Lisa Bates used a fairly precise dataset for this indicator: percent of households that have incomes at or below at or below 80% of the HUD-adjusted median family income (MFI). The data source is HUD’s Consolidated Housing Affordability Strategy (CHAS) as used. Unfortunately, the most recent CHAS data is based on the 2009-2013 ACS 5-year estimate.
Rather than introduce an inconsistency in the observation periods of this assessment’s datasets, this method uses an approximation of the 80% AMI metric using the ACS Household Income (B19001), 2010-2014 5-year estimate. This data is structured as household counts within a range of annual household income (e.g. $15,000 to $19,999). The FY 2015 MFI Estimate for Seattle-Bellevue, WA HUD Metro FMR Area is $89,500. In inflation-adjusted 2014 dollars that is $87,732.78, and 80% of that equals $70,200; which puts it within the $60,000 to $74,999 range. Therefore, for this assessment any household with an annual income of $74,999 or less is considered to be low-income.

LS0tCmRmX3ByaW50OiB0aWJibGUKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpgYGB7ciB2dWxuLXBvYy1zZXR1cCwgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsY29tbWVudD1GQUxTRX0KbGlicmFyeShwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHJwcm9qcm9vdCkKbGlicmFyeShyZ2RhbCkKbGlicmFyeShzcCkKbGlicmFyeShyZ2VvcykKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGRvd25sb2FkZXIpCmxpYnJhcnkod2Vic2hvdCkKbGlicmFyeShodG1sdG9vbHMpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KHNoaW55KQpsaWJyYXJ5KGh0bWx3aWRnZXRzKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShhY3MpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtaXNjZ2lzKQpsaWJyYXJ5KG9wZXJhdG9yLnRvb2xzKQpsaWJyYXJ5KGxlYWZsZXQuZXh0cmFzKQpsaWJyYXJ5KHZpcmlkaXNMaXRlKQpsaWJyYXJ5KHNmKQpyb290IDwtIHJwcm9qcm9vdDo6aXNfcnN0dWRpb19wcm9qZWN0CnJvb3RfZmlsZSA8LSByb290JG1ha2VfZml4X2ZpbGUoKQpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjb21tZW50PUZBTFNFKQpgYGAKCiMjIyBJbnRyb2R1Y3Rpb24KCmBgYHtyIHZ1bG4tY29sb3JzfQpncmVlbiA8LSBtaXNjZ2lzOjptaXNjZ2lzX3BhbHMkdGFibGVhdV9jYXRbWyJncmVlbiJdXQpibHVlIDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtbImJsdWUiXV0Kb3JhbmdlIDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtbIm9yYW5nZSJdXQpyZWQgPC0gbWlzY2dpczo6bWlzY2dpc19wYWxzJHRhYmxlYXVfY2F0W1sicmVkIl1dCnRlYWwgPC0gbWlzY2dpczo6bWlzY2dpc19wYWxzJHRhYmxlYXVfY2F0W1sidGVhbCJdXQpwYWxfcmdiXzQgPC0gbWlzY2dpczo6bWlzY2dpc19wYWxzJHRhYmxlYXVfY2F0W2MoInJlZCIsImdvbGQiLCJncmVlbiIsImJsdWUiKV0gJT4lIHVubGlzdCAlPiUgcGFsZXR0ZSgpCnBhbF9yZ2JfNCA8LSBtaXNjZ2lzOjptaXNjZ2lzX3BhbHMkdGFibGVhdV9jYXRbYygicmVkIiwiZ29sZCIsImdyZWVuIiwiYmx1ZSIpXSAlPiUgdW5saXN0ICU+JSBwYWxldHRlKCkKcGFsX3JnYl82IDwtIG1pc2NnaXM6Om1pc2NnaXNfcGFscyR0YWJsZWF1X2NhdFtjKCJyZWQiLCJnb2xkIiwiZ3JlZW4iLCJibHVlIiwib3JhbmdlIiwicHVycGxlIildICU+JSB1bmxpc3QgJT4lIHBhbGV0dGUoKQpwYWxfcmdiXzYgPC0gbWlzY2dpczo6bWlzY2dpc19wYWxzJHRhYmxlYXVfY2F0W2MoInJlZCIsImdvbGQiLCJncmVlbiIsImJsdWUiLCJvcmFuZ2UiLCJwdXJwbGUiKV0gJT4lIHVubGlzdCAlPiUgcGFsZXR0ZSgpCnByb2pfbGlnaHRfZ3JleSA8LSBjb2wyaGV4KCJncmV5NzUiKQpwcm9qX2dyZXkgPC0gY29sMmhleCgiZ3JleTUwIikKcHJval9kYXJrX2dyZXkgPC0gY29sMmhleCgiZ3JleTI1IikKYGBgCgpfTk9URTogdGhpcyB0ZXh0IGlzIHBsYWNlaG9sZGVyIGFuZCBtdXN0IGJlIGNoYW5nZWRfCgpDZW5zdXMgdHJhY3RzIHdlcmUgYXNzaWduZWQgYSDigJx2dWxuZXJhYmlsaXR5IHNjb3Jl4oCdIGJldHdlZW4gMCBhbmQgNCwgd2l0aCBhIHdlaWdodCBvZiAxIGZvciBlYWNoCm9mIHRoZSBmb2xsb3dpbmcgdGhhdCBpcyB0cnVlOgoKICAqIEdyZWF0ZXIgdGhhbiBYWCUgb2YgaG91c2Vob2xkcyBhcmUgcmVudGVycwogICogR3JlYXRlciB0aGFuIFhYJSBvZiB0aGUgcG9wdWxhdGlvbiBhcmUgY29tbXVuaXRpZXMgb2YgY29sb3IKICAqIEdyZWF0ZXIgdGhhbiBYWCUgb2YgdGhlIHBvcHVsYXRpb24gMjUgeWVhcnMgYW5kIG9sZGVyIGRvIG5vdCBoYXZlIGEgYmFjaGVsb3LigJlzIGRlZ3JlZQogICogR3JlYXRlciB0aGFuIFhYJSBvZiBob3VzZWhvbGRzIGhhdmUgaW5jb21lcyBhdCBvciBiZWxvdyBhdCBvciBiZWxvdyA4MCUgb2YgdGhlIEhVRGFkanVzdGVkCm1lZGlhbiBmYW1pbHkgaW5jb21lIChNRkkpIFtOb3RlOiBIVUQncyBGWTIwMTUgTUZJIGZvciB0aGUKU2VhdHRsZS1CZWxsZXZ1ZSwgV0EgSFVEIE1ldHJvIEZNUiBBcmVhIHdhcyAkODksNTAwLl0KCldlIGRlZmluZWQgdnVsbmVyYWJsZSB0cmFjdHMgYXMgdGhvc2Ugd2l0aCBhIHZ1bG5lcmFiaWxpdHkgc2NvcmUgb2YgYXQgbGVhc3QgMyBvdXQgb2YgNC4KCiMjIyBQb3B1bGF0aW9uIEJlbG9uZ2luZyB0byBBIENvbW11bml0eSBvZiBDb2xvciAoJSksIDIwMTAtMjAxNAoKIyMjIyBQbG90CmBgYHtyIHZ1bG4tcG9jLWFjc30KCiMgRG93bmxvYWQgdGhlIENlbnN1cyB0YWJsZSBmb3IgdGhlIHByb2plY3QncyBnZW9ncmFwaGllcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjb29fZ2VvX2FjcyA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vY29vLWdlby1hY3MucmRzJykpCgp2dWxuX3BvY190YmwgPC0gIkIwMzAwMiIgICMgY2Vuc3VzIHRhYmxlIGNvZGUKCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1wb2Mtb3JpZy1hY3MucmRzJykpKXsKICAgICAgICAKICAgICAgICBhY3MuZmV0Y2goZW5keWVhciA9IDIwMTQsIGdlb2dyYXBoeSA9IGNvb19nZW9fYWNzLCAKICAgICAgICAgICAgICAgICAgdGFibGUubnVtYmVyID0gdnVsbl9wb2NfdGJsKSAlPiUKICAgICAgICAgICAgICAgIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1wb2Mtb3JpZy1hY3MucmRzJykpCiAgICAgICAgCn0KCnZ1bG5fcG9jX29yaWdfYWNzIDwtIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLXBvYy1vcmlnLWFjcy5yZHMnKSkKCgojIFByb2Nlc3MgYW5kIHNhdmUgdGhlIGRhdGEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLXBvYy1hY3MucmRzJykpKXsKICAgICAgICB2dWxuX3BvY19hY3MxIDwtIHZ1bG5fcG9jX29yaWdfYWNzCiAgICAgICAgCiAgICAgICAgdnVsbl9wb2NfdGJsX2d1aWRlIDwtIAogICAgICAgICAgICAgICAgZGF0YS5mcmFtZSh0ZXJzZSA9IGFjcy5jb2xuYW1lcyh2dWxuX3BvY19hY3MxKSwKICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHkgPSBhY3MuY29sbmFtZXMoYWNzLmZldGNoKGVuZHllYXIgPSAyMDE0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9ncmFwaHkgPSBnZW8ubWFrZSh1cyA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5udW1iZXIgPSB2dWxuX3BvY190YmwsY29sLm5hbWVzID0gJ3ByZXR0eScpKSkKICAgICAgICAjIFB1bGwgb3V0IHRoZSBzcGVjaWZpYyBjb2x1bW5zIHRoYXQgYXJlIGltcG9ydGFudAogICAgICAgIAogICAgICAgIGdldF9jb2wgPC0gZnVuY3Rpb24ocGF0dGVybil7CiAgICAgICAgICAgICAgICB2dWxuX3BvY190YmxfZ3VpZGUgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHByZXR0eSxwYXR0ZXJuKSkgJT4lIHNlbGVjdCh0ZXJzZSkgJT4lIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkgJT4lIGFzLmNoYXJhY3RlcigpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRvdGFsIDwtIGdldF9jb2woJ1RvdGFsJykKICAgICAgICAKICAgICAgICB3aGl0ZV9ub3RfaGlzcCA8LSBnZXRfY29sKCdOb3QgSGlzcGFuaWMgb3IgTGF0aW5vOiBXaGl0ZSBhbG9uZScpCiAgICAgICAgCiAgICAgICAgIyBTdWJ0cmFjdCB3aGl0ZSBub24taGlzcGFuaWMgcG9wLiBmcm9tIHRoZSB0b3RhbCBwb3AuIChkaWZmZXJlbmNlIGlzIHRoZSBQT0MgcG9wLikKICAgICAgICAKICAgICAgICB2dWxuX3BvY19hY3MyIDwtIHZ1bG5fcG9jX2FjczFbLCB0b3RhbF0gLSB2dWxuX3BvY19hY3MxWywgd2hpdGVfbm90X2hpc3BdIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBhY3MuY29sbmFtZXModnVsbl9wb2NfYWNzMikgPC0gIlBPQyIKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgdnVsbl9wb2NfYWNzMyA8LSBjYmluZCh2dWxuX3BvY19hY3MxLCB2dWxuX3BvY19hY3MyKQogICAgICAgIAogICAgICAgICMgRmluZCB0aGUgcHJvcG9ydGlvbiBvZiBQZW9wbGUgb2YgQ29sb3IgdG8gdGhlIFRvdGFsIHBvcHVsYXRpb24KICAgICAgICAKICAgICAgICBhY3NfY29sX3BjdF9wb2MgPC0gIAogICAgICAgICAgICAgICAgYWNzOjphcHBseShYID0gdnVsbl9wb2NfYWNzM1ssJ1BPQyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNQVJHSU4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBkaXZpZGUuYWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IHZ1bG5fcG9jX2FjczNbLHRvdGFsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInByb3BvcnRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpCiAgICAgICAgYWNzLmNvbG5hbWVzKGFjc19jb2xfcGN0X3BvYykgPC0gJ1BDVF9QT0MnCiAgICAgICAgCiAgICAgICAgIyBTYXZlIHRoZSBvYmplY3QKCmFjc19jb2xfcGN0X3BvYyAlPiUgc2F2ZVJEUyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1wb2MtYWNzLnJkcycpKQp9Cgp2dWxuX3BvY19hY3MgPC0gcmVhZF9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcG9jLWFjcy5yZHMnKSkKCgojIFBsb3QgdGhlIGRhdGEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBwbG90KHZ1bG5fcG9jX2FjcykKCnBsb3QodnVsbl9wb2NfYWNzW29yZGVyKGVzdGltYXRlKHZ1bG5fcG9jX2FjcykpLDFdKQojIHBsb3QodnVsbl9wb2NfYWNzW29yZGVyKHN0YW5kYXJkLmVycm9yKHZ1bG5fcG9jX2FjcykpLDFdKQoKCmBgYAoKYGBge3IgdnVsbi1wb2Mtc2Z9CgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcG9jLXNmLnJkcycpKSl7CiAgICAgICAgIyBSZWFkIGluIHRoZSBgc2ZgIG9iamVjdCBhbmQgcmUtb3JkZXIgdGhlIHJlY29yZHMgdG8gYnkgYEpPSU5fSURgIAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjb29fZ2Vvc19zZiA8LSAKICAgICAgICByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vY29vLWdlb3Mtc2YucmRzJykpCgpjb29fZ2Vvc19zZl9vcmRlcmVkIDwtIGNvb19nZW9zX3NmICU+JSBhcnJhbmdlKGRlc2MoSk9JTl9JRCkpICU+JSBzZWxlY3QoLUpPSU5fSUQpCgojCiMgQ29udmVydCB0aGUgYGFjc2Agb2JqZWN0IGludG8gYSBkYXRhZnJhbWUsIGpvaW4gdG8gc2Ygb2JqZWN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvb192dWxuX3BvY19zZiA8LSAKICAgICAgICBkYXRhLmZyYW1lKAogICAgICAgICAgICAgICAgZ2VvZ3JhcGh5KHZ1bG5fcG9jX2FjcylbIk5BTUUiXSwKICAgICAgICAgICAgICAgIGdlb2dyYXBoeSh2dWxuX3BvY19hY3MpWyJ0cmFjdCJdLAogICAgICAgICAgICAgICAgZXN0aW1hdGUodnVsbl9wb2NfYWNzKSwgCiAgICAgICAgICAgICAgICAxLjY0NSAqIHN0YW5kYXJkLmVycm9yKHZ1bG5fcG9jX2FjcykpICU+JSAKICAgICAgICBgY29sbmFtZXM8LWAoLiwgYygiTkFNRSIsIkdFT0lENiIsICJQT0NfUENUX0VTVCIsIlBPQ19QQ1RfTU9FIikpICU+JSAKICAgICAgICBtdXRhdGUoSk9JTl9JRCA9IGNhc2Vfd2hlbiguJE5BTUUgJWluJSAnS2luZyBDb3VudHksIFdhc2hpbmd0b24nIH4gJ0tDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4kTkFNRSAlaW4lICdTZWF0dGxlIENDRCwgS2luZyBDb3VudHksIFdhc2hpbmd0b24nIH4gJ1NFQUNDRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoLiRHRU9JRDYpIH4gLiRHRU9JRDYpLAogICAgICAgICAgICAgICBVUFBFUiA9IFBPQ19QQ1RfRVNUICsgUE9DX1BDVF9NT0UsIAogICAgICAgICAgICAgICBMT1dFUiA9IFBPQ19QQ1RfRVNUIC0gUE9DX1BDVF9NT0UsIAogICAgICAgICAgICAgICBQT0NfUENUX1VQUEVSID0gaWZfZWxzZShVUFBFUiA+IDEsIDEsIFVQUEVSKSwgCiAgICAgICAgICAgICAgIFBPQ19QQ1RfTE9XRVIgPSBpZl9lbHNlKExPV0VSIDwgMCwgMCwgTE9XRVIpKSAlPiUgCiAgICAgICAgc2VsZWN0KEpPSU5fSUQsZXZlcnl0aGluZygpLC1OQU1FLC1HRU9JRDYsLVVQUEVSLC1MT1dFUikgJT4lIAogICAgICAgIGFycmFuZ2UoZGVzYyhKT0lOX0lEKSkgJT4lCiAgICAgICAgYmluZF9jb2xzKGNvb19nZW9zX3NmX29yZGVyZWQpICU+JSAKICAgICAgICBzdF9zZigpCgojCiMgU2F2ZSB0aGUgb2JqZWN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY29vX3Z1bG5fcG9jX3NmICU+JSB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcG9jLXNmLnJkcycpKQp9Cgpjb29fdnVsbl9wb2Nfc2YgPC0gIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLXBvYy1zZi5yZHMnKSkKCgpgYGAKCiMjIyMgTWFwcwoKVGhlc2UgbWFwcyBzaG93IHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgYmVsb25ncyB0byBhIGNvbW11bml0eSBvZiBjb2xvciBmb3IgZWFjaCBjZW5zdXMgdHJhY3QgaW4gU2VhdHRsZSBDQ0QuCgojIyMjIyBTZWF0dGxlIENDRCAKYGBge3IgdnVsbi1wb2Mtc2VhY2NkLW1hcH0KCnRyIDwtIAogICAgICAgIGNvb192dWxuX3BvY19zZiAlPiUgCiAgICAgICAgZmlsdGVyKEdFT0dSQVBIWSA9PSAndHJhY3QnICYgU0VBQ0NEX0xHTCkKCnRyX2NvbW0gPC0gCiAgICAgICAgY29vX3Z1bG5fcG9jX3NmICU+JSAKICAgICAgICBmaWx0ZXIoR0VPR1JBUEhZID09ICd0cmFjdCcgJiBTRUFDQ0RfTEdMICYhaXMubmEoTkFNRSkpCgpjb21tIDwtIGNvb192dWxuX3BvY19zZiAlPiUgCiAgICAgICAgZmlsdGVyKEdFT0dSQVBIWSA9PSAnY29tbXVuaXR5JykKCmNvbW1fY250ciA8LSBjb21tICU+JSBtdXRhdGUoZ2VvbWV0cnkgPSBzdF9jZW50cm9pZChjb21tKSkKCnBhbF9wb2MgPC0gY29sb3JOdW1lcmljKHZpcmlkaXMoMjU2LCBvcHRpb24gPSAiQyIpLHRyJFBPQ19QQ1RfRVNUKQoKbXlMZmx0R3JleSgpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHIsJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9wb2MoUE9DX1BDVF9FU1QpLAogICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCd3aGl0ZScpLAogICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAuNSwKICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDApICU+JQogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBhcyhjb21tLCdTcGF0aWFsJyksCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsCiAgICAgICAgICAgICAgICBjb2xvciA9IHByb2pfZGFya19ncmV5LAogICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkQXdlc29tZU1hcmtlcnMoZGF0YSA9IGFzKGNvbW1fY250ciwgIlNwYXRpYWwiKSxvcHRpb25zID0gbWFya2VyT3B0aW9ucyhvcGFjaXR5ID0gMCksbGFiZWwgPSB+IE5BTUVfRlVMTCwgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IFRSVUUsZGlyZWN0aW9uID0gJ2xlZnQnLCB0ZXh0T25seSA9IFRSVUUpKSAlPiUgCiAgICAgICAgYWRkTGVnZW5kKHRpdGxlID0gIlBlb3BsZSBvZjxicj5Db2xvciIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICAgcGFsID0gcGFsX3BvYywgCiAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRyJFBPQ19QQ1RfRVNULAogICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChzdWZmaXggPSAnJScsdHJhbnNmb3JtID0gZnVuY3Rpb24oeCkgMTAwICogeCkpICU+JSAKICAgICAgICBzdHlsZVdpZGdldChzdHlsZSA9ICJ0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7dGV4dC1zaGFkb3c6LTFweCAwICNGRkZGRkYsMCAxcHggI0ZGRkZGRiwxcHggMCAjRkZGRkZGLDAgLTFweCAjRkZGRkZGIikKCmBgYAoKIyMjIyNDT08gQ29tbXVuaXRpZXMKYGBge3IgdnVsbi1wb2MtY29tbS1tYXB9Cm15TGZsdEdyZXkoKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKHRyX2NvbW0sJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9wb2MoUE9DX1BDVF9FU1QpLAogICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCd3aGl0ZScpLAogICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAuNSwKICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDApICU+JQogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBhcyhjb21tLCdTcGF0aWFsJyksCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsCiAgICAgICAgICAgICAgICBjb2xvciA9IHByb2pfZGFya19ncmV5LAogICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkQXdlc29tZU1hcmtlcnMoZGF0YSA9IGFzKGNvbW1fY250ciwgIlNwYXRpYWwiKSxvcHRpb25zID0gbWFya2VyT3B0aW9ucyhvcGFjaXR5ID0gMCksbGFiZWwgPSB+IE5BTUVfRlVMTCwgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IFRSVUUsZGlyZWN0aW9uID0gJ2xlZnQnLCB0ZXh0T25seSA9IFRSVUUpKSAlPiUgCiAgICAgICAgYWRkTGVnZW5kKHRpdGxlID0gIlBlb3BsZSBvZjxicj5Db2xvciIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICAgcGFsID0gcGFsX3BvYywgCiAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRyJFBPQ19QQ1RfRVNULAogICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChzdWZmaXggPSAnJScsdHJhbnNmb3JtID0gZnVuY3Rpb24oeCkgMTAwICogeCkpICU+JSAKICAgICAgICBzdHlsZVdpZGdldChzdHlsZSA9ICJ0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7dGV4dC1zaGFkb3c6LTFweCAwICNGRkZGRkYsMCAxcHggI0ZGRkZGRiwxcHggMCAjRkZGRkZGLDAgLTFweCAjRkZGRkZGIikKCmBgYAoKIyMjIFBvcHVsYXRpb24gaW4gUmVudGVyLU9jY3VwaWVkIEhvdXNpbmcgVW5pdHMgKCUpLCAyMDEwLTIwMTQKYGBge3IgdnVsbi1yZW50LWFjc30KCiMgRG93bmxvYWQgdGhlIENlbnN1cyB0YWJsZSBmb3IgdGhlIHByb2plY3QncyBnZW9ncmFwaGllcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZighZXhpc3RzKCdjb29fZ2VvX2FjcycpKXtjb29fZ2VvX2FjcyA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vY29vLWdlby1hY3MucmRzJykpfQoKdnVsbl9yZW50X3RibCA8LSAiQjI1MDMzIiAgIyBjZW5zdXMgdGFibGUgY29kZQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLXJlbnQtb3JpZy1hY3MucmRzJykpKXsKICAgICAgICAKICAgICAgICBhY3MuZmV0Y2goZW5keWVhciA9IDIwMTQsIGdlb2dyYXBoeSA9IGNvb19nZW9fYWNzLCAKICAgICAgICAgICAgICAgICAgdGFibGUubnVtYmVyID0gdnVsbl9yZW50X3RibCkgJT4lCiAgICAgICAgICAgICAgICB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcmVudC1vcmlnLWFjcy5yZHMnKSkKICAgICAgICAKfQoKdnVsbl9yZW50X29yaWdfYWNzIDwtIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLXJlbnQtb3JpZy1hY3MucmRzJykpCgoKIyBQcm9jZXNzIGFuZCBzYXZlIHRoZSBkYXRhCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1yZW50LWFjcy5yZHMnKSkpewogICAgICAgIHZ1bG5fcmVudF9hY3MxIDwtIHZ1bG5fcmVudF9vcmlnX2FjcwogICAgICAgIAogICAgICAgIHZ1bG5fcmVudF90YmxfZ3VpZGUgPC0gCiAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHRlcnNlID0gYWNzLmNvbG5hbWVzKHZ1bG5fcmVudF9hY3MxKSwKICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHkgPSBhY3MuY29sbmFtZXMoYWNzLmZldGNoKGVuZHllYXIgPSAyMDE0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9ncmFwaHkgPSBnZW8ubWFrZSh1cyA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5udW1iZXIgPSB2dWxuX3JlbnRfdGJsLGNvbC5uYW1lcyA9ICdwcmV0dHknKSkpCiAgICAgICAgIyBQdWxsIG91dCB0aGUgc3BlY2lmaWMgY29sdW1ucyB0aGF0IGFyZSBpbXBvcnRhbnQKICAgICAgICAKICAgICAgICBnZXRfY29sIDwtIGZ1bmN0aW9uKHBhdHRlcm4pewogICAgICAgICAgICAgICAgdnVsbl9yZW50X3RibF9ndWlkZSAlPiUgZmlsdGVyKHN0cl9kZXRlY3QocHJldHR5LHBhdHRlcm4pKSAlPiUgc2VsZWN0KHRlcnNlKSAlPiUgdW5saXN0KHVzZS5uYW1lcyA9IEZBTFNFKSAlPiUgYXMuY2hhcmFjdGVyKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdG90YWwgPC0gZ2V0X2NvbCgnVG90YWw6JykKICAgICAgICAKICAgICAgICByZW50IDwtIGdldF9jb2woJ1JlbnRlciBvY2N1cGllZDokJykKICAgICAgICAKICAgICAgICAjIEZpbmQgdGhlIHByb3BvcnRpb24gb2YgcmVudGVycyB0byB0aGUgVG90YWwgcG9wdWxhdGlvbgogICAgICAgIAogICAgICAgIGFjc19jb2xfcGN0X3JlbnQgPC0gIAogICAgICAgICAgICAgICAgYWNzOjphcHBseShYID0gdnVsbl9yZW50X2FjczFbLHJlbnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNQVJHSU4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBkaXZpZGUuYWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IHZ1bG5fcmVudF9hY3MxWyx0b3RhbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJwcm9wb3J0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQogICAgICAgIGFjcy5jb2xuYW1lcyhhY3NfY29sX3BjdF9yZW50KSA8LSAnUENUX1JFTlQnCiAgICAgICAgCiAgICAgICAgIyBTYXZlIHRoZSBvYmplY3QKCmFjc19jb2xfcGN0X3JlbnQgJT4lIHNhdmVSRFMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcmVudC1hY3MucmRzJykpCn0KCnZ1bG5fcmVudF9hY3MgPC0gcmVhZF9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcmVudC1hY3MucmRzJykpCgoKIyBQbG90IHRoZSBkYXRhCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgcGxvdCh2dWxuX3JlbnRfYWNzKQoKcGxvdCh2dWxuX3JlbnRfYWNzW29yZGVyKGVzdGltYXRlKHZ1bG5fcmVudF9hY3MpKSwxXSkKIyBwbG90KHZ1bG5fcmVudF9hY3Nbb3JkZXIoc3RhbmRhcmQuZXJyb3IodnVsbl9yZW50X2FjcykpLDFdKQoKYGBgCgpgYGB7ciB2dWxuLXJlbnQtc2Z9CgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tcmVudC1zZi5yZHMnKSkpewogICAgICAgICMgUmVhZCBpbiB0aGUgYHNmYCBvYmplY3QgYW5kIHJlLW9yZGVyIHRoZSByZWNvcmRzIHRvIGJ5IGBKT0lOX0lEYCAKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYoIWV4aXN0cygnY29vX2dlb3Nfc2YnKSl7Y29vX2dlb3Nfc2YgPC0gcmVhZF9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2Nvby1nZW9zLXNmLnJkcycpKX0gICAgICAgIAogICAgICAgIApjb29fZ2Vvc19zZl9vcmRlcmVkIDwtIGNvb19nZW9zX3NmICU+JSBhcnJhbmdlKEpPSU5fSUQpICU+JSBzZWxlY3QoLUpPSU5fSUQpCgojCiMgQ29udmVydCB0aGUgYGFjc2Agb2JqZWN0IGludG8gYSBkYXRhZnJhbWUsIGpvaW4gdG8gc2Ygb2JqZWN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvb192dWxuX3JlbnRfc2YgPC0gCiAgICAgICAgZGF0YS5mcmFtZSgKICAgICAgICAgICAgICAgIGdlb2dyYXBoeSh2dWxuX3JlbnRfYWNzKVsiTkFNRSJdLAogICAgICAgICAgICAgICAgZ2VvZ3JhcGh5KHZ1bG5fcmVudF9hY3MpWyJ0cmFjdCJdLAogICAgICAgICAgICAgICAgZXN0aW1hdGUodnVsbl9yZW50X2FjcyksIAogICAgICAgICAgICAgICAgMS42NDUgKiBzdGFuZGFyZC5lcnJvcih2dWxuX3JlbnRfYWNzKSkgJT4lIAogICAgICAgIGBjb2xuYW1lczwtYCguLCBjKCJOQU1FIiwiR0VPSUQ2IiwgIlJFTlRfUENUX0VTVCIsIlJFTlRfUENUX01PRSIpKSAlPiUgCiAgICAgICAgbXV0YXRlKEpPSU5fSUQgPSBjYXNlX3doZW4oLiROQU1FICVpbiUgJ0tpbmcgQ291bnR5LCBXYXNoaW5ndG9uJyB+ICdLQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJE5BTUUgJWluJSAnU2VhdHRsZSBDQ0QsIEtpbmcgQ291bnR5LCBXYXNoaW5ndG9uJyB+ICdTRUFDQ0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKC4kR0VPSUQ2KSB+IC4kR0VPSUQ2KSwKICAgICAgICAgICAgICAgVVBQRVIgPSBSRU5UX1BDVF9FU1QgKyBSRU5UX1BDVF9NT0UsIAogICAgICAgICAgICAgICBMT1dFUiA9IFJFTlRfUENUX0VTVCAtIFJFTlRfUENUX01PRSwgCiAgICAgICAgICAgICAgIFJFTlRfUENUX1VQUEVSID0gaWZfZWxzZShVUFBFUiA+IDEsIDEsIFVQUEVSKSwgCiAgICAgICAgICAgICAgIFJFTlRfUENUX0xPV0VSID0gaWZfZWxzZShMT1dFUiA8IDAsIDAsIExPV0VSKSkgJT4lIAogICAgICAgIHNlbGVjdChKT0lOX0lELGV2ZXJ5dGhpbmcoKSwtTkFNRSwtR0VPSUQ2LC1VUFBFUiwtTE9XRVIpICU+JSAKICAgICAgICBhcnJhbmdlKGRlc2MoSk9JTl9JRCkpICU+JQogICAgICAgIGJpbmRfY29scyhjb29fZ2Vvc19zZl9vcmRlcmVkKSAlPiUgCiAgICAgICAgc3Rfc2YoKQoKIwojIFNhdmUgdGhlIG9iamVjdAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNvb192dWxuX3JlbnRfc2YgJT4lIHdyaXRlX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1yZW50LXNmLnJkcycpKQp9Cgpjb29fdnVsbl9yZW50X3NmIDwtICByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1yZW50LXNmLnJkcycpKQoKCmBgYAoKIyMjIyMgU2VhdHRsZSBDQ0QgCmBgYHtyIHZ1bG4tcmVudC1zZWFjY2QtbWFwfQoKdHIgPC0gCiAgICAgICAgY29vX3Z1bG5fcmVudF9zZiAlPiUgCiAgICAgICAgZmlsdGVyKEdFT0dSQVBIWSA9PSAndHJhY3QnICYgU0VBQ0NEX0xHTCkKCnRyX2NvbW0gPC0gCiAgICAgICAgY29vX3Z1bG5fcmVudF9zZiAlPiUgCiAgICAgICAgZmlsdGVyKEdFT0dSQVBIWSA9PSAndHJhY3QnICYgU0VBQ0NEX0xHTCAmIWlzLm5hKE5BTUUpKQoKY29tbSA8LSBjb29fdnVsbl9yZW50X3NmICU+JSAKICAgICAgICBmaWx0ZXIoR0VPR1JBUEhZID09ICdjb21tdW5pdHknKQoKY29tbV9jbnRyIDwtIGNvbW0gJT4lIG11dGF0ZShnZW9tZXRyeSA9IHN0X2NlbnRyb2lkKGNvbW0pKQoKcGFsX3JlbnQgPC0gY29sb3JOdW1lcmljKHZpcmlkaXMoMjU2LCBvcHRpb24gPSAiQyIpLHRyJFJFTlRfUENUX0VTVCkKCm15TGZsdEdyZXkoKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKHRyLCdTcGF0aWFsJyksCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC43NSwKICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfcmVudChSRU5UX1BDVF9FU1QpLAogICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCd3aGl0ZScpLAogICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAuNSwKICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDApICU+JQogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBhcyhjb21tLCdTcGF0aWFsJyksCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsCiAgICAgICAgICAgICAgICBjb2xvciA9IHByb2pfZGFya19ncmV5LAogICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkQXdlc29tZU1hcmtlcnMoZGF0YSA9IGFzKGNvbW1fY250ciwgIlNwYXRpYWwiKSxvcHRpb25zID0gbWFya2VyT3B0aW9ucyhvcGFjaXR5ID0gMCksbGFiZWwgPSB+IE5BTUVfRlVMTCwgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IFRSVUUsZGlyZWN0aW9uID0gJ2xlZnQnLCB0ZXh0T25seSA9IFRSVUUpKSAlPiUgCiAgICAgICAgYWRkTGVnZW5kKHRpdGxlID0gIlJlbnRlcnMiLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICd0b3ByaWdodCcsCiAgICAgICAgICAgICAgICAgIHBhbCA9IHBhbF9yZW50LCAKICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdHIkUkVOVF9QQ1RfRVNULAogICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgICBsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChzdWZmaXggPSAnJScsdHJhbnNmb3JtID0gZnVuY3Rpb24oeCkgMTAwICogeCkpICU+JSAKICAgICAgICBzdHlsZVdpZGdldChzdHlsZSA9ICJ0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7dGV4dC1zaGFkb3c6LTFweCAwICNGRkZGRkYsMCAxcHggI0ZGRkZGRiwxcHggMCAjRkZGRkZGLDAgLTFweCAjRkZGRkZGIikKCmBgYAoKIyMjIyNDT08gQ29tbXVuaXRpZXMKYGBge3IgdnVsbi1yZW50LWNvbW0tbWFwfQpteUxmbHRHcmV5KCkgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBhcyh0cl9jb21tLCdTcGF0aWFsJyksCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC43NSwKICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfcG9jKFJFTlRfUENUX0VTVCksCiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoJ3doaXRlJyksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IC41LAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKGNvbW0sJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgIGNvbG9yID0gcHJval9kYXJrX2dyZXksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwKSAlPiUKICAgICAgICBhZGRBd2Vzb21lTWFya2VycyhkYXRhID0gYXMoY29tbV9jbnRyLCAiU3BhdGlhbCIpLG9wdGlvbnMgPSBtYXJrZXJPcHRpb25zKG9wYWNpdHkgPSAwKSxsYWJlbCA9IH4gTkFNRV9GVUxMLCBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMobm9IaWRlID0gVFJVRSxkaXJlY3Rpb24gPSAnbGVmdCcsIHRleHRPbmx5ID0gVFJVRSkpICU+JSAKICAgICAgICBhZGRMZWdlbmQodGl0bGUgPSAiUmVudGVycyIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICAgcGFsID0gcGFsX3BvYywgCiAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRyJFJFTlRfUENUX0VTVCwKICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC43NSwKICAgICAgICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQoc3VmZml4ID0gJyUnLHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHgpIDEwMCAqIHgpKSAlPiUgCiAgICAgICAgc3R5bGVXaWRnZXQoc3R5bGUgPSAidGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtc2hhZG93Oi0xcHggMCAjRkZGRkZGLDAgMXB4ICNGRkZGRkYsMXB4IDAgI0ZGRkZGRiwwIC0xcHggI0ZGRkZGRiIpCgpgYGAKCiMjIyBBZHVsdHMgMjUrIFdpdGggTGVzcyBUaGFuIGEgQmFjaGVsb3IgRGVncmVlICglKSwgMjAxMC0yMDE0CmBgYHtyIHZ1bG4tbHQtYmFjaC1hY3N9CgojIERvd25sb2FkIHRoZSBDZW5zdXMgdGFibGUgZm9yIHRoZSBwcm9qZWN0J3MgZ2VvZ3JhcGhpZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaWYoIWV4aXN0cygnY29vX2dlb19hY3MnKSl7Y29vX2dlb19hY3MgPC0gcmVhZF9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2Nvby1nZW8tYWNzLnJkcycpKX0KCnZ1bG5fbHRfYmFjaF90YmwgPC0gIkIxNTAwMyIgICMgY2Vuc3VzIHRhYmxlIGNvZGUKCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sdC1iYWNoLW9yaWctYWNzLnJkcycpKSl7CiAgICAgICAgCiAgICAgICAgYWNzLmZldGNoKGVuZHllYXIgPSAyMDE0LCBnZW9ncmFwaHkgPSBjb29fZ2VvX2FjcywgCiAgICAgICAgICAgICAgICAgIHRhYmxlLm51bWJlciA9IHZ1bG5fbHRfYmFjaF90YmwpICU+JQogICAgICAgICAgICAgICAgd3JpdGVfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWx0LWJhY2gtb3JpZy1hY3MucmRzJykpCiAgICAgICAgCn0KCnZ1bG5fbHRfYmFjaF9vcmlnX2FjcyA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sdC1iYWNoLW9yaWctYWNzLnJkcycpKQoKCiMgUHJvY2VzcyBhbmQgc2F2ZSB0aGUgZGF0YQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tbHQtYmFjaC1hY3MucmRzJykpKXsKICAgICAgICB2dWxuX2x0X2JhY2hfYWNzMSA8LSB2dWxuX2x0X2JhY2hfb3JpZ19hY3MKICAgICAgICAKICAgICAgICB2dWxuX2x0X2JhY2hfdGJsX2d1aWRlIDwtIAogICAgICAgICAgICAgICAgZGF0YS5mcmFtZSh0ZXJzZSA9IGFjcy5jb2xuYW1lcyh2dWxuX2x0X2JhY2hfYWNzMSksCiAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5ID0gYWNzLmNvbG5hbWVzKGFjcy5mZXRjaChlbmR5ZWFyID0gMjAxNCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvZ3JhcGh5ID0gZ2VvLm1ha2UodXMgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUubnVtYmVyID0gdnVsbl9sdF9iYWNoX3RibCxjb2wubmFtZXMgPSAncHJldHR5JykpKQogICAgICAgICMgUHVsbCBvdXQgdGhlIHNwZWNpZmljIGNvbHVtbnMgdGhhdCBhcmUgaW1wb3J0YW50CiAgICAgICAgCiAgICAgICAgZ2V0X2NvbCA8LSBmdW5jdGlvbihwYXR0ZXJuKXsKICAgICAgICAgICAgICAgIHZ1bG5fbHRfYmFjaF90YmxfZ3VpZGUgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHByZXR0eSxwYXR0ZXJuKSkgJT4lIHNlbGVjdCh0ZXJzZSkgJT4lIHVubGlzdCh1c2UubmFtZXMgPSBGQUxTRSkgJT4lIGFzLmNoYXJhY3RlcigpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRvdGFsIDwtIGdldF9jb2woJ1RvdGFsOicpCiAgICAgICAgCiAgICAgICAgYmFjaF9wbHVzIDwtIGdldF9jb2woJ0JhY2hlbG9yfE1hc3RlcnxQcm9mZXNzaW9uYWx8RG9jdG9yYXRlJykKICAgICAgICAKICAgICAgICAjIEFkZCBhbGwgcG9wcyB3aXRoIGJhY2guIG9yIGhpZ2hlcgogICAgICAgIAogICAgICAgIGFjc19jb2xfYmFjaF9wbHVzIDwtIAogICAgICAgICAgICAgICAgYWNzOjphcHBseShYID0gdnVsbl9sdF9iYWNoX2FjczFbLGJhY2hfcGx1c10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUkdJTiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQogICAgICAgIAogICAgICAgIGFjcy5jb2xuYW1lcyhhY3NfY29sX2JhY2hfcGx1cykgPC0gIkJBQ0hfUExVUyIKICAgICAgICAKICAgICAgICBhY3NfY29sX2x0X2JhY2ggPC0gdnVsbl9sdF9iYWNoX2FjczFbLHRvdGFsXSAtIGFjc19jb2xfYmFjaF9wbHVzWywiQkFDSF9QTFVTIl0KICAgICAgICAKICAgICAgICBhY3MuY29sbmFtZXMoYWNzX2NvbF9sdF9iYWNoKSA8LSAiTFRfQkFDSCIKICAgICAgIAogICAgICAgICMgRmluZCB0aGUgcHJvcG9ydGlvbiBvZiByZW50ZXJzIHRvIHRoZSBUb3RhbCBwb3B1bGF0aW9uCiAgICAgICAgYWNzX2NvbF9wY3RfbHRfYmFjaCA8LSAgCiAgICAgICAgICAgICAgICBhY3M6OmFwcGx5KFggPSBhY3NfY29sX2x0X2JhY2hbLCJMVF9CQUNIIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUkdJTiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IGRpdmlkZS5hY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gdnVsbl9sdF9iYWNoX2FjczFbLHRvdGFsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInByb3BvcnRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpCiAgICAgICAgCiAgICAgICAgYWNzLmNvbG5hbWVzKGFjc19jb2xfcGN0X2x0X2JhY2gpIDwtICdQQ1RfTFRfQkFDSCcKICAgICAgICAKICAgICAgICAjIFNhdmUgdGhlIG9iamVjdAoKYWNzX2NvbF9wY3RfbHRfYmFjaCAlPiUgc2F2ZVJEUyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sdC1iYWNoLWFjcy5yZHMnKSkKfQoKdnVsbl9sdF9iYWNoX2FjcyA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sdC1iYWNoLWFjcy5yZHMnKSkKCgojIFBsb3QgdGhlIGRhdGEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBwbG90KHZ1bG5fbHRfYmFjaF9hY3MpCgpwbG90KHZ1bG5fbHRfYmFjaF9hY3Nbb3JkZXIoZXN0aW1hdGUodnVsbl9sdF9iYWNoX2FjcykpLDFdKQojIHBsb3QodnVsbl9sdF9iYWNoX2Fjc1tvcmRlcihzdGFuZGFyZC5lcnJvcih2dWxuX2x0X2JhY2hfYWNzKSksMV0pCgpgYGAKCmBgYHtyIHZ1bG4tbHQtYmFjaC1zZn0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sdC1iYWNoLXNmLnJkcycpKSl7CiAgICAgICAgIyBSZWFkIGluIHRoZSBgc2ZgIG9iamVjdCBhbmQgcmUtb3JkZXIgdGhlIHJlY29yZHMgdG8gYnkgYEpPSU5fSURgIAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZighZXhpc3RzKCdjb29fZ2Vvc19zZicpKXtjb29fZ2Vvc19zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vY29vLWdlb3Mtc2YucmRzJykpfSAgICAgICAgCiAgICAgICAgCmNvb19nZW9zX3NmX29yZGVyZWQgPC0gY29vX2dlb3Nfc2YgJT4lIGFycmFuZ2UoSk9JTl9JRCkgJT4lIHNlbGVjdCgtSk9JTl9JRCkKCiMKIyBDb252ZXJ0IHRoZSBgYWNzYCBvYmplY3QgaW50byBhIGRhdGFmcmFtZSwgam9pbiB0byBzZiBvYmplY3QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29vX3Z1bG5fbHRfYmFjaF9zZiA8LSAKICAgICAgICBkYXRhLmZyYW1lKAogICAgICAgICAgICAgICAgZ2VvZ3JhcGh5KHZ1bG5fbHRfYmFjaF9hY3MpWyJOQU1FIl0sCiAgICAgICAgICAgICAgICBnZW9ncmFwaHkodnVsbl9sdF9iYWNoX2FjcylbInRyYWN0Il0sCiAgICAgICAgICAgICAgICBlc3RpbWF0ZSh2dWxuX2x0X2JhY2hfYWNzKSwgCiAgICAgICAgICAgICAgICAxLjY0NSAqIHN0YW5kYXJkLmVycm9yKHZ1bG5fbHRfYmFjaF9hY3MpKSAlPiUgCiAgICAgICAgYGNvbG5hbWVzPC1gKC4sIGMoIk5BTUUiLCJHRU9JRDYiLCAiTFRfQkFDSF9QQ1RfRVNUIiwiTFRfQkFDSF9QQ1RfTU9FIikpICU+JSAKICAgICAgICBtdXRhdGUoSk9JTl9JRCA9IGNhc2Vfd2hlbiguJE5BTUUgJWluJSAnS2luZyBDb3VudHksIFdhc2hpbmd0b24nIH4gJ0tDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4kTkFNRSAlaW4lICdTZWF0dGxlIENDRCwgS2luZyBDb3VudHksIFdhc2hpbmd0b24nIH4gJ1NFQUNDRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoLiRHRU9JRDYpIH4gLiRHRU9JRDYpLAogICAgICAgICAgICAgICBVUFBFUiA9IExUX0JBQ0hfUENUX0VTVCArIExUX0JBQ0hfUENUX01PRSwgCiAgICAgICAgICAgICAgIExPV0VSID0gTFRfQkFDSF9QQ1RfRVNUIC0gTFRfQkFDSF9QQ1RfTU9FLCAKICAgICAgICAgICAgICAgTFRfQkFDSF9QQ1RfVVBQRVIgPSBpZl9lbHNlKFVQUEVSID4gMSwgMSwgVVBQRVIpLCAKICAgICAgICAgICAgICAgTFRfQkFDSF9QQ1RfTE9XRVIgPSBpZl9lbHNlKExPV0VSIDwgMCwgMCwgTE9XRVIpKSAlPiUgCiAgICAgICAgc2VsZWN0KEpPSU5fSUQsZXZlcnl0aGluZygpLC1OQU1FLC1HRU9JRDYsLVVQUEVSLC1MT1dFUikgJT4lIAogICAgICAgIGFycmFuZ2UoZGVzYyhKT0lOX0lEKSkgJT4lCiAgICAgICAgYmluZF9jb2xzKGNvb19nZW9zX3NmX29yZGVyZWQpICU+JSAKICAgICAgICBzdF9zZigpCgojCiMgU2F2ZSB0aGUgb2JqZWN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY29vX3Z1bG5fbHRfYmFjaF9zZiAlPiUgd3JpdGVfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWx0LWJhY2gtc2YucmRzJykpCn0KCmNvb192dWxuX2x0X2JhY2hfc2YgPC0gIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWx0LWJhY2gtc2YucmRzJykpCgoKYGBgCgojIyMjIyBTZWF0dGxlIENDRCAKYGBge3IgdnVsbi1sdC1iYWNoLXNlYWNjZC1tYXB9Cgp0ciA8LSAKICAgICAgICBjb29fdnVsbl9sdF9iYWNoX3NmICU+JSAKICAgICAgICBmaWx0ZXIoR0VPR1JBUEhZID09ICd0cmFjdCcgJiBTRUFDQ0RfTEdMKQoKdHJfY29tbSA8LSAKICAgICAgICBjb29fdnVsbl9sdF9iYWNoX3NmICU+JSAKICAgICAgICBmaWx0ZXIoR0VPR1JBUEhZID09ICd0cmFjdCcgJiBTRUFDQ0RfTEdMICYhaXMubmEoTkFNRSkpCgpjb21tIDwtIGNvb192dWxuX2x0X2JhY2hfc2YgJT4lIAogICAgICAgIGZpbHRlcihHRU9HUkFQSFkgPT0gJ2NvbW11bml0eScpCgpjb21tX2NudHIgPC0gY29tbSAlPiUgbXV0YXRlKGdlb21ldHJ5ID0gc3RfY2VudHJvaWQoY29tbSkpCgpwYWxfbHRfYmFjaCA8LSBjb2xvck51bWVyaWModmlyaWRpcygyNTYsIG9wdGlvbiA9ICJDIiksdHIkTFRfQkFDSF9QQ1RfRVNUKQoKbXlMZmx0R3JleSgpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHIsJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9yZW50KExUX0JBQ0hfUENUX0VTVCksCiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoJ3doaXRlJyksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IC41LAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKGNvbW0sJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgIGNvbG9yID0gcHJval9kYXJrX2dyZXksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwKSAlPiUKICAgICAgICBhZGRBd2Vzb21lTWFya2VycyhkYXRhID0gYXMoY29tbV9jbnRyLCAiU3BhdGlhbCIpLG9wdGlvbnMgPSBtYXJrZXJPcHRpb25zKG9wYWNpdHkgPSAwKSxsYWJlbCA9IH4gTkFNRV9GVUxMLCBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMobm9IaWRlID0gVFJVRSxkaXJlY3Rpb24gPSAnbGVmdCcsIHRleHRPbmx5ID0gVFJVRSkpICU+JSAKICAgICAgICBhZGRMZWdlbmQodGl0bGUgPSAiTEVTUyBUSEFOPGJyPkJBQ0guIERFR1JFRSIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICAgcGFsID0gcGFsX2x0X2JhY2gsIAogICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0ciRMVF9CQUNIX1BDVF9FU1QsCiAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAuNzUsCiAgICAgICAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHN1ZmZpeCA9ICclJyx0cmFuc2Zvcm0gPSBmdW5jdGlvbih4KSAxMDAgKiB4KSkgJT4lIAogICAgICAgIHN0eWxlV2lkZ2V0KHN0eWxlID0gInRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LXNoYWRvdzotMXB4IDAgI0ZGRkZGRiwwIDFweCAjRkZGRkZGLDFweCAwICNGRkZGRkYsMCAtMXB4ICNGRkZGRkYiKQoKYGBgCgojIyMjI0NPTyBDb21tdW5pdGllcwpgYGB7ciB2dWxuLWx0LWJhY2gtY29tbS1tYXB9Cm15TGZsdEdyZXkoKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKHRyX2NvbW0sJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9sdF9iYWNoKExUX0JBQ0hfUENUX0VTVCksCiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoJ3doaXRlJyksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IC41LAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKGNvbW0sJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgIGNvbG9yID0gcHJval9kYXJrX2dyZXksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwKSAlPiUKICAgICAgICBhZGRBd2Vzb21lTWFya2VycyhkYXRhID0gYXMoY29tbV9jbnRyLCAiU3BhdGlhbCIpLG9wdGlvbnMgPSBtYXJrZXJPcHRpb25zKG9wYWNpdHkgPSAwKSxsYWJlbCA9IH4gTkFNRV9GVUxMLCBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMobm9IaWRlID0gVFJVRSxkaXJlY3Rpb24gPSAnbGVmdCcsIHRleHRPbmx5ID0gVFJVRSkpICU+JSAKICAgICAgICBhZGRMZWdlbmQodGl0bGUgPSAiTEVTUyBUSEFOPGJyPkJBQ0guIERFR1JFRSIsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JywKICAgICAgICAgICAgICAgICAgcGFsID0gcGFsX2x0X2JhY2gsIAogICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0ciRMVF9CQUNIX1BDVF9FU1QsCiAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAuNzUsCiAgICAgICAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHN1ZmZpeCA9ICclJyx0cmFuc2Zvcm0gPSBmdW5jdGlvbih4KSAxMDAgKiB4KSkgJT4lIAogICAgICAgIHN0eWxlV2lkZ2V0KHN0eWxlID0gInRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LXNoYWRvdzotMXB4IDAgI0ZGRkZGRiwwIDFweCAjRkZGRkZGLDFweCAwICNGRkZGRkYsMCAtMXB4ICNGRkZGRkYiKQoKYGBgCgojIyMgSG91c2Vob2xkIGVhcm5pbmcgbGVzcyB0aGFuIDgwJSBvZiB0aGUgSFVEICwgMjAxMC0yMDE0CgpUaGlzIGluZGljYXRvciBpcyBpbnRlbmRlZCBhcyBhIHByb3h5IGZvciBsb3ctaW5jb21lIGhvdXNlaG9sZHMuIFRoZXJlIGFyZSBtYW55IHBvc3NpYmxlIHdheXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBob3VzZWhvbGQgZml0cyB0aGlzIGNhdGVnb3J5LCBidXQgb25lIGNvbW1vbmx5LXVzZWQgbWV0cmljIGlzIHRoZSBhcmVhIG1lZGlhbiBpbmNvbWUgKEFNSSkuIEdlbmVyYWxseSBzcGVha2luZywgaG91c2Vob2xkcyBlYXJuaW5nIGxlc3MgdGhhbiA4MCUgQU1JIGFyZSBjb25zaWRlcmVkIHRvIGJlIGxvdy1pbmNvbWUgaG91c2Vob2xkcywgYXMgc3RhdHVzIHdoaWNoIGhhcyBpbXBsaWNhdGlvbnMgZm9yIGFmZm9yZGFibGUgaG91c2luZyBlbGlnaWJpbGl0eS4gCgpUaGUgTGlzYSBCYXRlcyB1c2VkIGEgZmFpcmx5IHByZWNpc2UgZGF0YXNldCBmb3IgdGhpcyBpbmRpY2F0b3I6IHBlcmNlbnQgb2YgaG91c2Vob2xkcyB0aGF0IGhhdmUgaW5jb21lcyBhdCBvciBiZWxvdyBhdCBvciBiZWxvdyA4MCUgb2YgdGhlIEhVRC1hZGp1c3RlZCBtZWRpYW4gZmFtaWx5IGluY29tZSAoTUZJKS4gVGhlIGRhdGEgc291cmNlIGlzIEhVRCdzIENvbnNvbGlkYXRlZCBIb3VzaW5nIEFmZm9yZGFiaWxpdHkgU3RyYXRlZ3kgKENIQVMpIGFzIHVzZWQuIFVuZm9ydHVuYXRlbHksIHRoZSBbbW9zdCByZWNlbnQgQ0hBUyBkYXRhXShodHRwczovL3d3dy5odWR1c2VyLmdvdi9wb3J0YWwvZGF0YXNldHMvY3AvQ0hBUy9kYXRhX2Rvd25sb2FkX2NoYXMuaHRtbCkgaXMgYmFzZWQgb24gdGhlIDIwMDktMjAxMyBBQ1MgNS15ZWFyIGVzdGltYXRlLiAKClJhdGhlciB0aGFuIGludHJvZHVjZSBhbiBpbmNvbnNpc3RlbmN5IGluIHRoZSBvYnNlcnZhdGlvbiBwZXJpb2RzIG9mIHRoaXMgYXNzZXNzbWVudCdzIGRhdGFzZXRzLCB0aGlzIG1ldGhvZCB1c2VzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIDgwJSBBTUkgbWV0cmljIHVzaW5nIHRoZSBBQ1MgSG91c2Vob2xkIEluY29tZSAoQjE5MDAxKSwgMjAxMC0yMDE0IDUteWVhciBlc3RpbWF0ZS4gVGhpcyBkYXRhIGlzIHN0cnVjdHVyZWQgYXMgaG91c2Vob2xkIGNvdW50cyB3aXRoaW4gYSByYW5nZSBvZiBhbm51YWwgaG91c2Vob2xkIGluY29tZSAoZS5nLiAkMTUsMDAwIHRvICQxOSw5OTkpLiBUaGUgRlkgMjAxNSBNRkkgRXN0aW1hdGUgZm9yIFNlYXR0bGUtQmVsbGV2dWUsIFdBIEhVRCBNZXRybyBGTVIgQXJlYSBpcyAkODksNTAwLiBJbiBpbmZsYXRpb24tYWRqdXN0ZWQgMjAxNCBkb2xsYXJzIHRoYXQgaXMgJDg3LDczMi43OCwgYW5kIDgwJSBvZiB0aGF0IGVxdWFscyAkNzAsMjAwOyB3aGljaCBwdXRzIGl0IHdpdGhpbiB0aGUgYCQ2MCwwMDAgdG8gJDc0LDk5OWAgcmFuZ2UuIFRoZXJlZm9yZSwgZm9yIHRoaXMgYXNzZXNzbWVudCBhbnkgaG91c2Vob2xkIHdpdGggYW4gYW5udWFsIGluY29tZSBvZiAkNzQsOTk5IG9yIGxlc3MgaXMgY29uc2lkZXJlZCB0byBiZSBsb3ctaW5jb21lLgoKYGBge3IgdnVsbi1sb3ctaW5jLWFjc30KCiMgRG93bmxvYWQgdGhlIENlbnN1cyB0YWJsZSBmb3IgdGhlIHByb2plY3QncyBnZW9ncmFwaGllcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZighZXhpc3RzKCdjb29fZ2VvX2FjcycpKXtjb29fZ2VvX2FjcyA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vY29vLWdlby1hY3MucmRzJykpfQoKdnVsbl9sb3dfaW5jX3RibCA8LSAiQjE5MDAxIiAgIyBjZW5zdXMgdGFibGUgY29kZQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWxvdy1pbmMtb3JpZy1hY3MucmRzJykpKXsKICAgICAgICAKICAgICAgICBhY3MuZmV0Y2goZW5keWVhciA9IDIwMTQsIGdlb2dyYXBoeSA9IGNvb19nZW9fYWNzLCAKICAgICAgICAgICAgICAgICAgdGFibGUubnVtYmVyID0gdnVsbl9sb3dfaW5jX3RibCkgJT4lCiAgICAgICAgICAgICAgICB3cml0ZV9yZHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL3Z1bG4tbG93LWluYy1vcmlnLWFjcy5yZHMnKSkKICAgICAgICAKfQoKdnVsbl9sb3dfaW5jX29yaWdfYWNzIDwtIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWxvdy1pbmMtb3JpZy1hY3MucmRzJykpCgoKIyBQcm9jZXNzIGFuZCBzYXZlIHRoZSBkYXRhCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sb3ctaW5jLWFjcy5yZHMnKSkpewogICAgICAgIHZ1bG5fbG93X2luY19hY3MxIDwtIHZ1bG5fbG93X2luY19vcmlnX2FjcwogICAgICAgIAogICAgICAgIHZ1bG5fbG93X2luY190YmxfZ3VpZGUgPC0gCiAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHRlcnNlID0gYWNzLmNvbG5hbWVzKHZ1bG5fbG93X2luY19hY3MxKSwKICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHkgPSBhY3MuY29sbmFtZXMoYWNzLmZldGNoKGVuZHllYXIgPSAyMDE0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9ncmFwaHkgPSBnZW8ubWFrZSh1cyA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5udW1iZXIgPSB2dWxuX2xvd19pbmNfdGJsLGNvbC5uYW1lcyA9ICdwcmV0dHknKSkpCiAgICAgICAgIyBQdWxsIG91dCB0aGUgc3BlY2lmaWMgY29sdW1ucyB0aGF0IGFyZSBpbXBvcnRhbnQKICAgICAgICAKICAgICAgICBnZXRfY29sIDwtIGZ1bmN0aW9uKHBhdHRlcm4pewogICAgICAgICAgICAgICAgdnVsbl9sb3dfaW5jX3RibF9ndWlkZSAlPiUgZmlsdGVyKHN0cl9kZXRlY3QocHJldHR5LHBhdHRlcm4pKSAlPiUgc2VsZWN0KHRlcnNlKSAlPiUgdW5saXN0KHVzZS5uYW1lcyA9IEZBTFNFKSAlPiUgYXMuY2hhcmFjdGVyKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdG90YWwgPC0gZ2V0X2NvbCgnVG90YWw6JykKICAgICAgICAKICAgICAgICBsb3dfaW5jIDwtIGdldF9jb2woJ1xcJDEwLHxcXCQxNCx8XFwkMTksfFxcJDI0LHxcXCQyOSx8XFwkMzQsfFxcJDM5LHxcXCQ0NCx8XFwkNDksfFxcJDU5LHxcXCQ3NCwnKQogICAgICAgIAogICAgICAgICMgQWRkIGFsbCBwb3BzIHdpdGggYmFjaC4gb3IgaGlnaGVyCiAgICAgICAgCiAgICAgICAgYWNzX2NvbF9sb3dfaW5jIDwtIAogICAgICAgICAgICAgICAgYWNzOjphcHBseShYID0gdnVsbl9sb3dfaW5jX2FjczFbLGxvd19pbmNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNQVJHSU4gPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKICAgICAgICAKICAgICAgICBhY3MuY29sbmFtZXMoYWNzX2NvbF9sb3dfaW5jKSA8LSAiTE9XX0lOQyIKICAgICAgIAogICAgICAgICMgRmluZCB0aGUgcHJvcG9ydGlvbiBvZiByZW50ZXJzIHRvIHRoZSBUb3RhbCBwb3B1bGF0aW9uCiAgICAgICAgYWNzX2NvbF9wY3RfbG93X2luYyA8LSAgCiAgICAgICAgICAgICAgICBhY3M6OmFwcGx5KFggPSBhY3NfY29sX2xvd19pbmNbLCJMT1dfSU5DIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUkdJTiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTiA9IGRpdmlkZS5hY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gdnVsbl9sb3dfaW5jX2FjczFbLHRvdGFsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInByb3BvcnRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpCiAgICAgICAgCiAgICAgICAgYWNzLmNvbG5hbWVzKGFjc19jb2xfcGN0X2xvd19pbmMpIDwtICdQQ1RfTE9XX0lOQycKICAgICAgICAKICAgICAgICAjIFNhdmUgdGhlIG9iamVjdAoKYWNzX2NvbF9wY3RfbG93X2luYyAlPiUgc2F2ZVJEUyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sb3ctaW5jLWFjcy5yZHMnKSkKfQoKdnVsbl9sb3dfaW5jX2FjcyA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sb3ctaW5jLWFjcy5yZHMnKSkKCgojIFBsb3QgdGhlIGRhdGEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBwbG90KHZ1bG5fbG93X2luY19hY3MpCgpwbG90KHZ1bG5fbG93X2luY19hY3Nbb3JkZXIoZXN0aW1hdGUodnVsbl9sb3dfaW5jX2FjcykpLDFdKQojIHBsb3QodnVsbl9sb3dfaW5jX2Fjc1tvcmRlcihzdGFuZGFyZC5lcnJvcih2dWxuX2xvd19pbmNfYWNzKSksMV0pCgpgYGAKCmBgYHtyIHZ1bG4tbG93LWluYy1zZn0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vdnVsbi1sb3ctaW5jLXNmLnJkcycpKSl7CiAgICAgICAgIyBSZWFkIGluIHRoZSBgc2ZgIG9iamVjdCBhbmQgcmUtb3JkZXIgdGhlIHJlY29yZHMgdG8gYnkgYEpPSU5fSURgIAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZighZXhpc3RzKCdjb29fZ2Vvc19zZicpKXtjb29fZ2Vvc19zZiA8LSByZWFkX3Jkcyhyb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0vY29vLWdlb3Mtc2YucmRzJykpfSAgICAgICAgCiAgICAgICAgCmNvb19nZW9zX3NmX29yZGVyZWQgPC0gY29vX2dlb3Nfc2YgJT4lIGFycmFuZ2UoSk9JTl9JRCkgJT4lIHNlbGVjdCgtSk9JTl9JRCkKCiMKIyBDb252ZXJ0IHRoZSBgYWNzYCBvYmplY3QgaW50byBhIGRhdGFmcmFtZSwgam9pbiB0byBzZiBvYmplY3QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29vX3Z1bG5fbG93X2luY19zZiA8LSAKICAgICAgICBkYXRhLmZyYW1lKAogICAgICAgICAgICAgICAgZ2VvZ3JhcGh5KHZ1bG5fbG93X2luY19hY3MpWyJOQU1FIl0sCiAgICAgICAgICAgICAgICBnZW9ncmFwaHkodnVsbl9sb3dfaW5jX2FjcylbInRyYWN0Il0sCiAgICAgICAgICAgICAgICBlc3RpbWF0ZSh2dWxuX2xvd19pbmNfYWNzKSwgCiAgICAgICAgICAgICAgICAxLjY0NSAqIHN0YW5kYXJkLmVycm9yKHZ1bG5fbG93X2luY19hY3MpKSAlPiUgCiAgICAgICAgYGNvbG5hbWVzPC1gKC4sIGMoIk5BTUUiLCJHRU9JRDYiLCAiTE9XX0lOQ19QQ1RfRVNUIiwiTE9XX0lOQ19QQ1RfTU9FIikpICU+JSAKICAgICAgICBtdXRhdGUoSk9JTl9JRCA9IGNhc2Vfd2hlbiguJE5BTUUgJWluJSAnS2luZyBDb3VudHksIFdhc2hpbmd0b24nIH4gJ0tDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4kTkFNRSAlaW4lICdTZWF0dGxlIENDRCwgS2luZyBDb3VudHksIFdhc2hpbmd0b24nIH4gJ1NFQUNDRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoLiRHRU9JRDYpIH4gLiRHRU9JRDYpLAogICAgICAgICAgICAgICBVUFBFUiA9IExPV19JTkNfUENUX0VTVCArIExPV19JTkNfUENUX01PRSwgCiAgICAgICAgICAgICAgIExPV0VSID0gTE9XX0lOQ19QQ1RfRVNUIC0gTE9XX0lOQ19QQ1RfTU9FLCAKICAgICAgICAgICAgICAgTE9XX0lOQ19QQ1RfVVBQRVIgPSBpZl9lbHNlKFVQUEVSID4gMSwgMSwgVVBQRVIpLCAKICAgICAgICAgICAgICAgTE9XX0lOQ19QQ1RfTE9XRVIgPSBpZl9lbHNlKExPV0VSIDwgMCwgMCwgTE9XRVIpKSAlPiUgCiAgICAgICAgc2VsZWN0KEpPSU5fSUQsZXZlcnl0aGluZygpLC1OQU1FLC1HRU9JRDYsLVVQUEVSLC1MT1dFUikgJT4lIAogICAgICAgIGFycmFuZ2UoZGVzYyhKT0lOX0lEKSkgJT4lCiAgICAgICAgYmluZF9jb2xzKGNvb19nZW9zX3NmX29yZGVyZWQpICU+JSAKICAgICAgICBzdF9zZigpCgojCiMgU2F2ZSB0aGUgb2JqZWN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY29vX3Z1bG5fbG93X2luY19zZiAlPiUgd3JpdGVfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWxvdy1pbmMtc2YucmRzJykpCn0KCmNvb192dWxuX2xvd19pbmNfc2YgPC0gIHJlYWRfcmRzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS92dWxuLWxvdy1pbmMtc2YucmRzJykpCgpgYGAKCgojIyMjIyBTZWF0dGxlIENDRCAKYGBge3IgdnVsbi1sb3ctaW5jLXNlYWNjZC1tYXB9Cgp0ciA8LSAKICAgICAgICBjb29fdnVsbl9sb3dfaW5jX3NmICU+JSAKICAgICAgICBmaWx0ZXIoR0VPR1JBUEhZID09ICd0cmFjdCcgJiBTRUFDQ0RfTEdMKQoKdHJfY29tbSA8LSAKICAgICAgICBjb29fdnVsbl9sb3dfaW5jX3NmICU+JSAKICAgICAgICBmaWx0ZXIoR0VPR1JBUEhZID09ICd0cmFjdCcgJiBTRUFDQ0RfTEdMICYhaXMubmEoTkFNRSkpCgpjb21tIDwtIGNvb192dWxuX2xvd19pbmNfc2YgJT4lIAogICAgICAgIGZpbHRlcihHRU9HUkFQSFkgPT0gJ2NvbW11bml0eScpCgpjb21tX2NudHIgPC0gY29tbSAlPiUgbXV0YXRlKGdlb21ldHJ5ID0gc3RfY2VudHJvaWQoY29tbSkpCgpwYWxfbG93X2luYyA8LSBjb2xvck51bWVyaWModmlyaWRpcygyNTYsIG9wdGlvbiA9ICJDIiksdHIkTE9XX0lOQ19QQ1RfRVNUKQoKbXlMZmx0R3JleSgpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHIsJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjc1LAogICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9sb3dfaW5jKExPV19JTkNfUENUX0VTVCksCiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoJ3doaXRlJyksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IC41LAogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCkgJT4lCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGFzKGNvbW0sJ1NwYXRpYWwnKSwKICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgIGNvbG9yID0gcHJval9kYXJrX2dyZXksCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwKSAlPiUKICAgICAgICBhZGRBd2Vzb21lTWFya2VycyhkYXRhID0gYXMoY29tbV9jbnRyLCAiU3BhdGlhbCIpLG9wdGlvbnMgPSBtYXJrZXJPcHRpb25zKG9wYWNpdHkgPSAwKSxsYWJlbCA9IH4gTkFNRV9GVUxMLCBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMobm9IaWRlID0gVFJVRSxkaXJlY3Rpb24gPSAnbGVmdCcsIHRleHRPbmx5ID0gVFJVRSkpICU+JSAKICAgICAgICBhZGRMZWdlbmQodGl0bGUgPSAiTG93IEluY29tZTxicj5Ib3VzZWhvbGRzIiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wcmlnaHQnLAogICAgICAgICAgICAgICAgICBwYWwgPSBwYWxfbG93X2luYywgCiAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRyJExPV19JTkNfUENUX0VTVCwKICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC43NSwKICAgICAgICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQoc3VmZml4ID0gJyUnLHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHgpIDEwMCAqIHgpKSAlPiUgCiAgICAgICAgc3R5bGVXaWRnZXQoc3R5bGUgPSAidGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtc2hhZG93Oi0xcHggMCAjRkZGRkZGLDAgMXB4ICNGRkZGRkYsMXB4IDAgI0ZGRkZGRiwwIC0xcHggI0ZGRkZGRiIpCgpgYGAKCiMjIyMjQ09PIENvbW11bml0aWVzCmBgYHtyIHZ1bG4tbG93LWluYy1jb21tLW1hcH0KbXlMZmx0R3JleSgpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXModHJfY29tbSwnU3BhdGlhbCcpLAogICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNzUsCiAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsX2xvd19pbmMoTE9XX0lOQ19QQ1RfRVNUKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gY29sMmhleCgnd2hpdGUnKSwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgd2VpZ2h0ID0gLjUsCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwKSAlPiUKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0gYXMoY29tbSwnU3BhdGlhbCcpLAogICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLAogICAgICAgICAgICAgICAgY29sb3IgPSBwcm9qX2RhcmtfZ3JleSwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwKICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDApICU+JQogICAgICAgIGFkZEF3ZXNvbWVNYXJrZXJzKGRhdGEgPSBhcyhjb21tX2NudHIsICJTcGF0aWFsIiksb3B0aW9ucyA9IG1hcmtlck9wdGlvbnMob3BhY2l0eSA9IDApLGxhYmVsID0gfiBOQU1FX0ZVTEwsIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyhub0hpZGUgPSBUUlVFLGRpcmVjdGlvbiA9ICdsZWZ0JywgdGV4dE9ubHkgPSBUUlVFKSkgJT4lIAogICAgICAgIGFkZExlZ2VuZCh0aXRsZSA9ICJSZW50ZXJzIiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wcmlnaHQnLAogICAgICAgICAgICAgICAgICBwYWwgPSBwYWxfbG93X2luYywgCiAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHRyJExPV19JTkNfUENUX0VTVCwKICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC43NSwKICAgICAgICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQoc3VmZml4ID0gJyUnLHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHgpIDEwMCAqIHgpKSAlPiUgCiAgICAgICAgc3R5bGVXaWRnZXQoc3R5bGUgPSAidGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtc2hhZG93Oi0xcHggMCAjRkZGRkZGLDAgMXB4ICNGRkZGRkYsMXB4IDAgI0ZGRkZGRiwwIC0xcHggI0ZGRkZGRiIpCgpgYGAKCg==